﻿//作者：       minjie.zhou
// 创建时间：   2012/12/15 15:16:01
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace AgileToDo.Common
{
  
    /// <summary>  
    /// 为PasswordBox控件的Password增加绑定功能  
    /// </summary>  
    internal static class PasswordBoxHelper  
    {  
        public static readonly DependencyProperty PasswordProperty =  
            DependencyProperty.RegisterAttached("Password",  
            typeof(string), typeof(PasswordBoxHelper),  
            new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));  
        public static readonly DependencyProperty AttachProperty =  
            DependencyProperty.RegisterAttached("Attach",  
            typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach));  
        private static readonly DependencyProperty IsUpdatingProperty =  
           DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),  
           typeof(PasswordBoxHelper));  
  
        public static void SetAttach(DependencyObject dp, bool value)  
        {  
            dp.SetValue(AttachProperty, value);  
        }  
        public static bool GetAttach(DependencyObject dp)  
        {  
            return (bool)dp.GetValue(AttachProperty);  
        }  
        public static string GetPassword(DependencyObject dp)  
        {  
            return (string)dp.GetValue(PasswordProperty);  
        }  
        public static void SetPassword(DependencyObject dp, string value)  
        {  
            dp.SetValue(PasswordProperty, value);  
        }  
        private static bool GetIsUpdating(DependencyObject dp)  
        {  
            return (bool)dp.GetValue(IsUpdatingProperty);  
        }  
        private static void SetIsUpdating(DependencyObject dp, bool value)  
        {  
            dp.SetValue(IsUpdatingProperty, value);  
        }  
        private static void OnPasswordPropertyChanged(DependencyObject sender,  
            DependencyPropertyChangedEventArgs e)  
        {  
            PasswordBox passwordBox = sender as PasswordBox;  
            passwordBox.PasswordChanged -= PasswordChanged;  
            if (!(bool)GetIsUpdating(passwordBox))  
            {  
                passwordBox.Password = (string)e.NewValue;  
            }  
            passwordBox.PasswordChanged += PasswordChanged;  
        }  
        private static void Attach(DependencyObject sender,  
            DependencyPropertyChangedEventArgs e)  
        {  
            PasswordBox passwordBox = sender as PasswordBox;  
            if (passwordBox == null)  
                return;  
            if ((bool)e.OldValue)  
            {  
                passwordBox.PasswordChanged -= PasswordChanged;  
            }  
            if ((bool)e.NewValue)  
            {  
                passwordBox.PasswordChanged += PasswordChanged;  
            }  
        }  
        private static void PasswordChanged(object sender, RoutedEventArgs e)  
        {  
            PasswordBox passwordBox = sender as PasswordBox;  
            SetIsUpdating(passwordBox, true);  
            SetPassword(passwordBox, passwordBox.Password);  
            SetIsUpdating(passwordBox, false);  
        }  
    }  
} 

